package com.example.demo.controller.system;

import com.example.demo.common.result.R;
import com.example.demo.dto.system.SubsystemFieldDTO;
import com.example.demo.entity.system.SysSubsystemField;
import com.example.demo.service.system.SysSubsystemFieldService;
import com.example.demo.service.system.SysSubsystemService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * 子系统字段控制器
 */
@RestController
@RequestMapping("/api/subsystem-fields")
public class SysSubsystemFieldController {

    @Autowired
    private SysSubsystemFieldService fieldService;
    
    @Autowired
    private SysSubsystemService subsystemService;

    /**
     * 查询字段列表
     */
    @GetMapping
    public R<List<SysSubsystemField>> list(SysSubsystemField field) {
        List<SysSubsystemField> list = fieldService.selectFieldList(field);
        return R.ok(list);
    }
    
    /**
     * 根据系统编码查询字段列表
     */
    @GetMapping("/system/{systemCode}")
    public R<List<SysSubsystemField>> listBySystemCode(@PathVariable("systemCode") String systemCode) {
        List<SysSubsystemField> list = fieldService.selectFieldsBySystemCode(systemCode);
        return R.ok(list);
    }
    
    /**
     * 根据系统编码查询字段列表（包含选项）
     */
    @GetMapping("/system/{systemCode}/with-options")
    public R<List<SubsystemFieldDTO>> listWithOptionsBySystemCode(@PathVariable("systemCode") String systemCode) {
        List<SubsystemFieldDTO> list = fieldService.selectFieldsWithOptionsBySystemCode(systemCode);
        return R.ok(list);
    }
    
    /**
     * 获取字段详细信息
     */
    @GetMapping("/{fieldId}")
    public R<SysSubsystemField> getInfo(@PathVariable("fieldId") Long fieldId) {
        SysSubsystemField field = fieldService.selectFieldById(fieldId);
        if (field == null) {
            return R.fail("字段不存在");
        }
        return R.ok(field);
    }
    
    /**
     * 获取字段详细信息（包含选项）
     */
    @GetMapping("/{fieldId}/with-options")
    public R<SubsystemFieldDTO> getInfoWithOptions(@PathVariable("fieldId") Long fieldId) {
        SubsystemFieldDTO field = fieldService.selectFieldWithOptionsById(fieldId);
        if (field == null) {
            return R.fail("字段不存在");
        }
        return R.ok(field);
    }
    
    /**
     * 新增字段
     */
    @PostMapping
    public R<SysSubsystemField> add(@RequestBody SubsystemFieldDTO fieldDTO) {
        // 校验系统编码是否存在
        if (subsystemService.selectSubsystemByCode(fieldDTO.getSystemCode()) == null) {
            return R.fail("系统编码不存在");
        }
        
        // 校验字段标识是否唯一
        SysSubsystemField field = new SysSubsystemField();
        field.setSystemCode(fieldDTO.getSystemCode());
        field.setFieldKey(fieldDTO.getFieldKey());
        if (!fieldService.checkFieldKeyUnique(field)) {
            return R.fail("字段标识已存在");
        }
        
        // 设置默认值
        if (fieldDTO.getStatus() == null) {
            fieldDTO.setStatus(1);
        }
        if (fieldDTO.getIsRequired() == null) {
            fieldDTO.setIsRequired(0);
        }
        if (fieldDTO.getOrderNum() == null) {
            fieldDTO.setOrderNum(0);
        }
        
        int rows = fieldService.insertField(fieldDTO);
        if (rows > 0) {
            SysSubsystemField newField = fieldService.selectFieldById(fieldDTO.getId());
            return R.ok(newField);
        }
        return R.fail("添加失败");
    }
    
    /**
     * 修改字段
     */
    @PutMapping("/{fieldId}")
    public R<Void> edit(@PathVariable("fieldId") Long fieldId, @RequestBody SubsystemFieldDTO fieldDTO) {
        // 检查字段是否存在
        SysSubsystemField existField = fieldService.selectFieldById(fieldId);
        if (existField == null) {
            return R.fail("字段不存在");
        }
        
        fieldDTO.setId(fieldId);
        
        // 校验字段标识是否唯一
        if (!existField.getFieldKey().equals(fieldDTO.getFieldKey())) {
            SysSubsystemField field = new SysSubsystemField();
            field.setId(fieldId);
            field.setSystemCode(existField.getSystemCode());
            field.setFieldKey(fieldDTO.getFieldKey());
            if (!fieldService.checkFieldKeyUnique(field)) {
                return R.fail("字段标识已存在");
            }
        }
        
        int rows = fieldService.updateField(fieldDTO);
        return rows > 0 ? R.ok() : R.fail("修改失败");
    }
    
    /**
     * 修改字段状态
     */
    @PutMapping("/{fieldId}/status")
    public R<Void> changeStatus(@PathVariable("fieldId") Long fieldId, @RequestBody Map<String, Integer> params) {
        // 检查字段是否存在
        SysSubsystemField existField = fieldService.selectFieldById(fieldId);
        if (existField == null) {
            return R.fail("字段不存在");
        }
        
        Integer status = params.get("status");
        if (status == null || (status != 0 && status != 1)) {
            return R.fail("状态值无效");
        }
        
        int rows = fieldService.updateFieldStatus(fieldId, status);
        return rows > 0 ? R.ok() : R.fail("状态修改失败");
    }
    
    /**
     * 删除字段
     */
    @DeleteMapping("/{fieldId}")
    public R<Void> remove(@PathVariable("fieldId") Long fieldId) {
        // 检查字段是否存在
        SysSubsystemField existField = fieldService.selectFieldById(fieldId);
        if (existField == null) {
            return R.fail("字段不存在");
        }
        
        int rows = fieldService.deleteFieldById(fieldId);
        return rows > 0 ? R.ok() : R.fail("删除失败");
    }
    
    /**
     * 批量删除字段
     */
    @DeleteMapping("/batch/{fieldIds}")
    public R<Void> batchRemove(@PathVariable("fieldIds") Long[] fieldIds) {
        int rows = fieldService.deleteFieldByIds(fieldIds);
        return rows > 0 ? R.ok() : R.fail("批量删除失败");
    }
} 